package com.swak.job.storage;

import java.time.LocalDateTime;
import java.util.List;

import com.swak.entity.Page;
import com.swak.entity.Parameters;
import com.swak.job.Job;
import com.swak.job.JobDispatch;
import com.swak.job.JobEvent;
import com.swak.job.JobTask;
import com.swak.job.domain.JobDTO;
import com.swak.job.domain.JobDispatchDTO;
import com.swak.job.domain.JobEventDTO;
import com.swak.job.domain.JobFailDTO;
import com.swak.job.domain.JobTaskDTO;
import com.swak.persistence.QueryCondition;

/**
 * 任务存储
 * 
 * @author lifeng
 * @date 2021年2月25日 下午1:10:30
 */
public interface StorageService {

	/**
	 * 初始化任务
	 * 
	 * @param job
	 */
	void create(Job job);

	/**
	 * 调度任务 -- 是否可以调度
	 * 
	 * @param job
	 */
	boolean dispatchJob(JobDispatch dispatch, boolean manualOps);

	/**
	 * 调度任务 -- 调度结束
	 * 
	 * @param job
	 */
	void dispatchJobResult(JobDispatch dispatch);

	/**
	 * 创建一个任务
	 * 
	 * @param job
	 * @param frag
	 * @return
	 */
	void createTask(JobTask task);

	/**
	 * 调度一个任务
	 * 
	 * @param job
	 * @param frag
	 * @return
	 */
	void dispatchTask(JobTask task);

	/**
	 * 执行一个任务
	 * 
	 * @param job
	 * @param frag
	 * @return
	 */
	void executeTask(JobTask task);

	/**
	 * 查询执行失败的任务
	 * 
	 * @param delayDate
	 * @return
	 */
	List<JobTask> queryFailTasks(LocalDateTime delayDate);

	/**
	 * 查询可调度的任务
	 * 
	 * @param dispatchDate 调度的日期
	 * @param limit        限制查询的数量
	 * @return
	 */
	List<JobEvent> queryDispatchableEvents(LocalDateTime dispatchDate, int limit);

	/**
	 * 创建一个事件
	 * 
	 * @param event
	 * @return
	 */
	void createEvent(JobEvent event);

	/**
	 * 调度一个事件
	 * 
	 * @param event
	 * @return
	 */
	void dispatchEvent(JobEvent event);

	Page<JobDTO> jobPage(QueryCondition query, Parameters param);

	Page<JobDispatchDTO> dispatchPage(QueryCondition query, Parameters param);

	Page<JobTaskDTO> taskPage(QueryCondition query, Parameters param);

	Page<JobFailDTO> failPage(QueryCondition query, Parameters param);

	Page<JobEventDTO> eventPage(QueryCondition query, Parameters param);
}